/*
题目: 二维网络迁移
给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。

每次「迁移」操作将会引发下述活动：

    位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
    位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
    位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。

请你返回 k 次迁移操作后最终得到的 二维网格。
 */
public class ShiftGridA {
    public List<List<Integer>> shiftGrid(int[][] grid, int k) {
        //先转化成一维数组
        int[] arr = new int[grid.length * grid[0].length];
        int index = 0;//记录arr数组下标
        int row = grid.length;
        int col = grid[0].length;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                arr[index++] = grid[i][j];
            }
        }

        int sum = row * col; //二维数组总个数
        //处理K
        while (k > sum) {
            k -= sum;
        }

        List<List<Integer>> ans = new ArrayList<> ();
        int cur = sum - k;//定位到开始操作的下标
        cur = sum == 1 ? 0 : cur;

        for (int i = 0; i < row; i++) {
            List<Integer> list = new ArrayList<> ();
            for (int j = 0; j < col; j++) {
                list.add(arr[cur]);
                cur = (cur + 1) % sum;
            }
            ans.add(list);
        }
        return ans;
    }
}
